package com.example.extra.utils;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.List;

public class IPUtils {

    /**
     * 获取客户端的真实IP地址
     * 处理了常见的代理服务器转发情况
     *
     * @param request HttpServletRequest对象
     * @return 客户端的真实IP地址
     */
    public static String getClientRealIp(HttpServletRequest request) {
        // 仅保留用于传递真实IP的HTTP头（移除cache-control）
        List<String> ipHeaders = Arrays.asList(
                "X-Forwarded-For",       // 多层代理时，第一个IP为客户端真实IP
                "Proxy-Client-IP",       // 代理服务器传递的客户端IP
                "WL-Proxy-Client-IP",    // WebLogic代理时的客户端IP
                "HTTP_CLIENT_IP",        // 部分代理服务器使用
                "HTTP_X_FORWARDED_FOR",  // 部分代理服务器使用
                "X-Real-IP"              // Nginx等代理常用，直接返回客户端真实IP
        );

        String ip = null;
        // 按优先级检查各个IP头
        for (String header : ipHeaders) {
            ip = request.getHeader(header);
            // 跳过空值或"unknown"
            if (StringUtils.hasText(ip) && !"unknown".equalsIgnoreCase(ip)) {
                break;
            }
        }

        // 处理X-Forwarded-For多IP情况（取第一个有效IP）
        if (StringUtils.hasText(ip) && ip.contains(",")) {
            ip = ip.split(",")[0].trim();
        }

        // 所有头都无效时，使用请求的远程地址
        if (!StringUtils.hasText(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        // 本地IPv6回环地址转为IPv4（方便本地测试）
        if ("0:0:0:0:0:0:0:1".equals(ip) || "::1".equals(ip)) {
            ip = "127.0.0.1";
        }

        return ip;
    }

}
